#include_function".\src\lib_Marisa.txt"

//0.275
//10
//6,6,6,3
//2,2,2,1
let DMG_MAINSHOT=2.75;
let DMG_STAR=[1.65,1.65,1.65,0.825];
let DMG_SPREAD=[0.55,0.55,0.55,0.275];


sub onInitialize_MarisaA{
	onInitialize_Marisa;
	LoadPlayerShotData(csd~"src\data_playershot_ma.txt");
}



task Main{
	yield;
	MainShotFire;
	Options;
	BombEffect;
	th10_System;
}



task Options{
	let posx=[GetPlayerX,GetPlayerX,GetPlayerX,GetPlayerX];
	let posy=[GetPlayerY,GetPlayerY,GetPlayerY,GetPlayerY];
	let scale=1;
	let gang=0;
	let fire=false;
	let scalex=1;
	let scaley=1;
	let dscale=0.05;
	let alpha=255;
	let dalpha=16;
	
	CreateOptions;
	Move;
	ShotControl;
	ScaleControl;
	VanishControl;
	Rotate;
	
	
	function CreateOptions{
		ascent(n in 0..4){Option(n);}
	}
	
	
	
	task Move{
		let playerx=[];
		let playery=[];
		let prev_playerx=GetPlayerX;
		let prev_playery=GetPlayerY;
		
		loop(32){
			playerx=playerx~[GetPlayerX];
			playery=playery~[GetPlayerY];
		}
		
		loop{
			if(!OnMissed || OnBorderOfLife){
				if(GetKeyState(VK_SLOWMOVE)==KEY_PUSH || GetKeyState(VK_SLOWMOVE)==KEY_HOLD){
					ascent(i in 0..32){
						playerx[i]=playerx[i]+(GetPlayerX-prev_playerx);
						playery[i]=playery[i]+(GetPlayerY-prev_playery);
					}
				}else{
					if(
						GetKeyState(VK_UP)==KEY_PUSH || GetKeyState(VK_UP)==KEY_HOLD ||
						GetKeyState(VK_DOWN)==KEY_PUSH || GetKeyState(VK_DOWN)==KEY_HOLD ||
						GetKeyState(VK_RIGHT)==KEY_PUSH || GetKeyState(VK_RIGHT)==KEY_HOLD ||
						GetKeyState(VK_LEFT)==KEY_PUSH || GetKeyState(VK_LEFT)==KEY_HOLD
					){
						playerx=erase(playerx,0);
						playery=erase(playery,0);
						playerx=playerx~[GetPlayerX];
						playery=playery~[GetPlayerY];
					}
				}
				prev_playerx=GetPlayerX;
				prev_playery=GetPlayerY;
			}else{
				ascent(i in 0..32){
					playerx[i]=224;
					playery[i]=400;
				}
				prev_playerx=224;
				prev_playery=400;
			}
			ascent(i in 1..5){
				posx[i-1]=playerx[32-i*8];
				posy[i-1]=playery[32-i*8];
			}
			
			yield;
		}
	}
	
	
	task ShotControl{
		let c=0;
		loop{
			if((GetKeyState(VK_SHOT)==KEY_PUSH)||(GetKeyState(VK_SHOT)==KEY_HOLD)){
				c=2;
			}
			
			if(c>0){
				fire=true;
				c--;
				yield;
				fire=false;
				loop(8){yield;}
			}
			yield;
		}
	}
	
	
	task ScaleControl{
		let ang=0;
		loop{
			scale=0.9-0.1*sin(ang);
			ang+=12;
			ang%=360;
			yield;
		}
	}
	
	
	task VanishControl{
		loop{
			if(OnMissed && !OnBorderOfLife){
				if(scalex>0){
					scalex-=dscale;
					scaley+=dscale;
				}
				if(alpha>0){
					alpha-=dalpha;
				}
			}else{
				scalex=1;
				scaley=1;
				alpha=255;
			}
			yield;
		}
	}
	
	
	task Rotate{
		loop{
			gang+=6;
			gang%=360;
			yield;
		}
	}
	
	
	task Option(num){
		let obje=Obj_Create(OBJ_EFFECT);
		let obj=Obj_Create(OBJ_EFFECT);
		
		let timer=10800;
		
		ObjEffect_SetTexture(obj,IMG_OPTION);
		ObjEffect_SetLayer(obj,2);
		ObjEffect_SetPrimitiveType(obj,PRIMITIVE_TRIANGLESTRIP);
		ObjEffect_CreateVertex(obj,4);
		ObjEffect_SetVertexUV(obj,0,0,0);
		ObjEffect_SetVertexUV(obj,1,0,16);
		ObjEffect_SetVertexUV(obj,2,16,0);
		ObjEffect_SetVertexUV(obj,3,16,16);
		ObjEffect_SetVertexXY(obj,0,-7,-7);
		ObjEffect_SetVertexXY(obj,1,-7,8);
		ObjEffect_SetVertexXY(obj,2,8,-7);
		ObjEffect_SetVertexXY(obj,3,8,8);
		
		ObjEffect_SetTexture(obje,IMG_OPTION);
		ObjEffect_SetLayer(obje,2);
		ObjEffect_SetRenderState(obje,ALPHA);
		ObjEffect_SetPrimitiveType(obje,PRIMITIVE_TRIANGLESTRIP);
		ObjEffect_CreateVertex(obje,4);
		ObjEffect_SetVertexUV(obje,0,0,16);
		ObjEffect_SetVertexUV(obje,1,0,32);
		ObjEffect_SetVertexUV(obje,2,16,16);
		ObjEffect_SetVertexUV(obje,3,16,32);
		ObjEffect_SetVertexXY(obje,0,-10.5,-10.5);
		ObjEffect_SetVertexXY(obje,1,-10.5,11.5);
		ObjEffect_SetVertexXY(obje,2,11.5,-10.5);
		ObjEffect_SetVertexXY(obje,3,11.5,11.5);
		
		while(!Obj_BeDeleted(obj)){
			if(OnMissed && !OnBorderOfLife){
				ObjEffect_SetRenderState(obj,ADD);
				ObjEffect_SetScale(obj,scalex,scaley);
			}else{
				ObjEffect_SetRenderState(obj,ALPHA);
				ObjEffect_SetScale(obj,scale,scale);
				Obj_SetPosition(obj,posx[num],posy[num]);
				Obj_SetPosition(obje,posx[num],posy[num]);
			}
			ascent(n in 0..4){ObjEffect_SetVertexColor(obje,n,alpha,255,255,255);}
			
			
			if(!OnMissed && !OnEvent){
				if(fire){
					SubShot(Obj_GetX(obj),Obj_GetY(obj),num);
				}
			}
			
			ObjEffect_SetAngle(obje,0,0,-gang);
			
			timer--;
			
			if(timer==0){
				Option(num);
				Obj_Delete(obj);
				Obj_Delete(obje);
				return;
			}
			yield;
		}
	}
	
	
	task SubShot(x,y,num){
		let obj=Obj_Create(OBJ_SHOT);
		let size;
		let a_size=[6,4,4,6,8,10,10,8];
		let count=0;
		let flg=false;
		Obj_SetPosition(obj,x,y);
		Obj_SetSpeed(obj,8);
		Obj_SetAngle(obj,270);
		ObjShot_SetGraphic(obj,2);
		ObjShot_SetDamage(obj,DMG_STAR[num]);
		ObjShot_SetPenetration(obj,1);
		
		let obje=Obj_Create(OBJ_EFFECT);
		ObjEffect_SetTexture(obje,IMG_SHOT);
		ObjEffect_SetPrimitiveType(obje,PRIMITIVE_TRIANGLESTRIP);
		ObjEffect_SetLayer(obje,2);
		ObjEffect_CreateVertex(obje,4);
		ObjEffect_SetVertexUV(obje,0,32,0);
		ObjEffect_SetVertexUV(obje,1,32,20);
		ObjEffect_SetVertexUV(obje,2,52,0);
		ObjEffect_SetVertexUV(obje,3,52,20);
		
		while(!Obj_BeDeleted(obj)){
			x=Obj_GetX(obj);
			y=Obj_GetY(obj);
			Obj_SetPosition(obje,x,y);
			flg=Obj_IsIntersected(obj);
			size=a_size[count%8];
			ObjEffect_SetVertexXY(obje,0,-size,-size);
			ObjEffect_SetVertexXY(obje,1,-size,size);
			ObjEffect_SetVertexXY(obje,2,size,-size);
			ObjEffect_SetVertexXY(obje,3,size,size);
			count++;
			yield;
		}
		Obj_Delete(obje);
		
		if(flg){
			Spread(x,y,num);
		}
	}
	
	
	task Spread(x,y,num){
		let obj=Obj_Create(OBJ_LASER);
		let size=42;
		let collision_size=64;
		let alpha=64;
		let dalpha=3.2;
		Obj_SetPosition(obj,x-(collision_size+18),y);
		Obj_SetAngle(obj,0);
		ObjShot_SetGraphic(obj,1);
		ObjShot_SetDamage(obj,DMG_SPREAD[num]);
		ObjShot_SetPenetration(obj,100000);
		ObjLaser_SetLength(obj,(collision_size+18)*2);
		ObjLaser_SetWidth(obj,collision_size*4);
		ObjLaser_SetSource(obj,false);
		
		let obje=Obj_Create(OBJ_EFFECT);
		ObjEffect_SetTexture(obje,IMG_EFFECTS);
		ObjEffect_SetPrimitiveType(obje,PRIMITIVE_TRIANGLESTRIP);
		ObjEffect_SetRenderState(obje,ADD);
		ObjEffect_SetLayer(obje,2);
		ObjEffect_CreateVertex(obje,4);
		ObjEffect_SetVertexUV(obje,0,0,128);
		ObjEffect_SetVertexUV(obje,1,0,256);
		ObjEffect_SetVertexUV(obje,2,128,128);
		ObjEffect_SetVertexUV(obje,3,128,256);
		ascent(i in 0..4){ObjEffect_SetVertexColor(obje,i,alpha,255,255,255);}
		Obj_SetPosition(obje,x,y);
		
		Damage;
		loop(8){
			Obj_SetPosition(obj,x-(collision_size+18),y);
			Obj_SetPosition(obje,x,y);
			y--;
			ObjEffect_SetVertexXY(obje,0,-size,-size);
			ObjEffect_SetVertexXY(obje,1,-size,size);
			ObjEffect_SetVertexXY(obje,2,size,-size);
			ObjEffect_SetVertexXY(obje,3,size,size);
			size+=2.75;
			yield;
		}
		loop(20){
			Obj_SetPosition(obj,x-(collision_size+18),y);
			Obj_SetPosition(obje,x,y);
			y--;
			ascent(i in 0..4){ObjEffect_SetVertexColor(obje,i,alpha,255,255,255);}
			alpha-=dalpha;
			ObjEffect_SetVertexXY(obje,0,-size,-size);
			ObjEffect_SetVertexXY(obje,1,-size,size);
			ObjEffect_SetVertexXY(obje,2,size,-size);
			ObjEffect_SetVertexXY(obje,3,size,size);
			size-=3.2;
			yield;
		}
		Obj_Delete(obje);
		
		task Damage{
			let flg=[true,false,true,true,true,false,true,true,true,false,true,true,true];
			ascent(i in 0..13){
				Obj_SetCollisionToPlayer(obj,flg[i]);
				yield;
			}
			Obj_Delete(obj);
		}
	}
}